package 多线程.ThreadLocal;

public class Test {
    /**
     * 一、什么是ThreadLocal
     * ThreadLocal是java.lang下面的一个类，在JDK 1.2版本加入，作者是Josh Bloch（集合大神）和Doug Lea（并发大神）。
     *
     * 它提供了一种线程局部变量的方式，线程局部变量是指每个线程都拥有自己独立的变量副本，互不干扰，通过ThreadLocal，可以方便地在多线程环境下共享数据，同时不需要考虑线程安全性，这也是解决并发问题的途径之一。
     *
     * 例如：在web开发中，可以使用ThreadLocal来保存用户的登录信息，以便每个线程都能够独立地获取和修改自己的登录信息，避免了线程之间的干扰。
     *
     * 二、ThreadLocal的使用
     * ThreadLocal有四个方法，分别为：
     *
     * protected T initialValue()：返回此线程局部变量的初始值。
     *
     * pubulic T get()： 返回当前线程局部变量的当前线程副本的值。如果这是线程第一次调用该方法，则创建并初始化此副本。
     *
     * public void set(T value)：将此线程局部变量的当前线程的副本设置为指定的值。
     *
     * public void remove()：移除此线程局部变量的当前线程的值。
     *
     * ps：由于ThreadLocal是基于线程的，所以在不同的线程中，
     * 通过ThreadLocal获取的用户信息是独立的，这在多线程环境下非常有用，可以避免线程之间的数据混乱和冲突。
     * @param args
     */
    public static void main(String[] args) {
        //用户登录
        User user = new User();
        user.setName("小黑子");
        user.setAge(18);
        //将用户信息保存在ThreadLocal中
        CurrentUserHolder.setUser(user);
        //在其它方法中，可以通过ThreadLocal获取用户信息
        User localUser = CurrentUserHolder.getUser();
        System.out.println(localUser);//输出：User(name=小黑子, age=18)
        //用户操作完成后，可以remove掉
        CurrentUserHolder.clearUser();

        System.out.println(CurrentUserHolder.getUser());
    }
}